home *** CD-ROM | disk | FTP | other *** search
- page 132,66,0,6
- opt rc
- ;*******************************************
- ;Motorola Austin DSP Operation June 30,1988
- ;*******************************************
- ;DSP56000/1
- ;8 pole cascaded transposed IIR filter
- ;File name: 6-56.asm
- ;**************************************************************************
- ; Maximum sample rate: 292.9 Khz at 20.5 MHZ/ 385.7 KHz at 27.0 MHz
- ; Memory Size: Prog: 9+11 words ; Data :4(2+5)=28 words
- ; Number of clock cycles: 70 (35 instruction cycles)
- ; Clock Frequency: 20.5MHz/27.0MHz
- ; Cycle time: 97.5ns / 74.1ns
- ;**************************************************************************
- ; This IIR filter reads the input sample
- ; from the memory location Y:input
- ; and writes the filtered output sample
- ; to the memory location Y:output
- ;
- ; The samples are stored in the X memory
- ; The coefficients are stored in the Y memory
- ;**************************************************************************
- ; initialization
- ;**********************
- nsec equ 4
- start equ $40
- wdd1 equ 0 ;w1,...
- wdd2 equ 8 ;w2,...
- cddr equ 0 ;b0,b1,a1,b2,a2
- input equ $ffe0
- output equ $ffe1
-
- ;The filter equations are:
- ; y = x*bi0 + w1
- ; w1 = x*bi1 + y*ai1 + w2
- ; w2 = x*bi2 + y*a2
- ;
- ; x --------------bi0---->(+)--------------------> y
- ; | ^ |
- ; | | w1 |
- ; | 1/z |
- ; | | |
- ; |----bi1---->(+)<---ai1----|
- ; | ^ |
- ; | | w2 |
- ; | 1/z |
- ; | | |
- ; |----bi2---->(+)<---ai2----|
- ;
- ; Implemented in that way:
- ;
- ; y/2 = bi0/2*x +w1/2
- ; w1/2= bi1/2*x -ai1/2*y +w2/2
- ; w2/2= bi2/2*x -ai2/2*y
- ;
- ; r0 -> X:xddr->w1
- ; r1 -> x:addr->w2
- ; r4 -> Y:cddr
- ;
- org p:start
- move #wdd1,r0 ;r0 -> w1
- move #wdd2,r1 ;r1 -> w2
- move #cddr,r4 ;r4 -> coefficients
- move #nsec-1,m0
- move m0,m1
- move #5*nsec-1,m4
- ;
- ori #$08,mr ;set scaling mode
- move x:(r0),a y:(r4)+,y0 ;a=w1;b=b0/2
- asr a ;a=w1/2
- ;
- opt cc
- ; filter loop: 7*nsec+7
- ;**********************************************
- movep y:input,y1 ;input sample in y1
- ;
- do #nsec,filt
- macr y1,y0,a x:(r1),b y:(r4)+,y0 ;a=y/2=x*bi0/2+w1/2;get w2,bi1/2
- asr b a,x0 ;b=w2/2; move y/2 to x0=y
- mac y1,y0,b y:(r4)+,y0 ;b=x*bi1/2+w2/2 ,get ai1/2
- macr x0,y0,b y:(r4)+,y0 ;b=b+y*ai1/2=w1/2, get bi2/2
- mpy y1,y0,b b,x:(r0)+ y:(r4)+,y0 ;b=x*bi2/2, save w1, get ai2/2
- macr x0,y0,b x:(r0),a a,y1 ;b=b+y*ai2/2=w2, get w1 ,y1=y
- asr a b,x:(r1)+ y:(r4)+,y0 ;a=w1/2, save w2, get b(i+1)0
- filt
- movep y1,y:output ;output sample
- ;***********************************************
- end
-